const puppeteer = require('puppeteer-core');
const log4js = require('log4js');
const logger = log4js.getLogger();
 //node连接MySQL数据库
 const mysql = require('mysql')

log4js.configure({
  appenders: {
   out: { type: 'stdout' },
   app: { type: 'file', filename: 'app.log' }
  },
  categories: {
   default: { appenders: [ 'out', 'app' ], level: 'debug' }
  }
 });

//创建连接
let conn=mysql.createConnection({
    //主机地址
    host:'localhost',
    //用户名
    user:'root',
    //密码
    password:'123456',
    //数据库名称
    database:'dev_curl_test'
})
//获取连接
conn.connect((err)=>{
    if(err) throw err;
    console.log('连接成功');
})

const sleep = (time) =>
  new Promise((resolve) => {
    setTimeout(resolve, time)
  })
 
const login = async ({ username, pwd }) => {
  // 使用puppeteer的launch（）方法获得一个操控浏览器的实例browser
  const browser = await puppeteer.launch({
    executablePath: 'C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe',
    slowMo: 100, //放慢速度
    headless: false, //无头浏览器：关闭
    defaultViewport: { width: 1920, height: 1000 }, //设置网页的尺寸
    ignoreHTTPSErrors: true, //忽略 https 报错,
    timeout: 100000,
    args: []
  })
  
  // 使用browser实例在内存中新建一个网页page
  const page = await browser.newPage()
  
   // 设定浏览器UserAgent
   await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36');

  // 使用网页page的goto（）方法进入指定的页面
  await page.goto('https://mypartners.xmcnbroker.info/#/login', {timeout: 100000})

  // 这一步十分重要，因为大部分大型网站都会对selenium机制进行检测，例如navigator.webdriver，navigator.languages等等。
  // 这一步就是把navigator的一些属性方法等等注入到浏览器中，绕过这些检测机制。
  await page.evaluate(async () => {
      Object.defineProperty(navigator, 'webdriver', { get: () => false })
  })

  // 模拟不同设备
  // await page.emulate(puppeteer.devices['iPhone 13']);

  console.log('打开页面')
 
  // 延迟1秒再操作
  sleep(1000)
 
  // 获取账号的DOM，对其进行操作，输入账号
  console.log('输入账号...')
  const inputUsername = await page.$('#inputID')
  inputUsername.focus()
  for (let i = 0; i < username.length; i++) {
    await inputUsername.type(username[i])
  }

  // 获取密码的DOM，对其进行操作，输入密码
  console.log('输入密码...')
  const inputPwd = await page.$('#inputPass')
  inputPwd.focus()
  for (let i = 0; i < pwd.length; i++) {
    await inputPwd.type(pwd[i])
  }
  // 获取提交按钮的DOM
  const btnConfirm = await page.$('.affiliate-login__login')

  console.log('执行登录...')
  
  // 等待页面跳转完成，一般点击某个按钮需要跳转时，都需要等待 page.waitForNavigation() 执行完毕才表示跳转成功
  await Promise.all([btnConfirm.click(), page.waitForNavigation()])  

  await sleep(2000)

  const cookies = await page.cookies()
 
  console.log(cookies)

  const sessionVal = ''

  cookies.forEach(element => {
    if (element.name == 'session') {
      sessionVal = element.value;
      console.log('session -> ', sessionVal)
      logger.debug(sessionVal)
    }
  });

  //修改数据
  var modSql = 'UPDATE ht_set SET value = ? WHERE id = 6';
  var modSqlParams = [sessionVal];
  conn.query(modSql, modSqlParams, (err, result)=>{
      if (err) {
        console.log(err.message);
      } else {
        console.log(result);
        console.log('修改成功');
      }
  })

  //await browser.close()

  //关闭数据库连接
  conn.end((err)=>{
    if (err) throw err;
    console.log("关闭成功");
  })

}

login({ username: '1021769', pwd: 'Abcabc123' })
 
